package com.shujujiegou.链表.双端链表;

/**
 * 对于单项链表，我们如果想在尾部添加一个节点，那么必须从头部一直遍历到尾部，
 * 找到尾节点，然后在尾节点后面插入一个节点。
 * 这样操作很麻烦，如果我们在设计链表的时候多个对尾节点的引用，那么会简单很多
 */
public class DoublePointLinkedList {
    private Integer size;
    private Node head;
    private Node real;

    public DoublePointLinkedList() {
        this.size = 0;
        this.head = null;
        this.real = null;
    }

    //链表头新增节点
    public void addHead(Object data) {
        Node node = new Node(data);
        if(isEmpty()) {
           this.real = node;
        } else {
            node.next = this.head;
        }
        this.head = node;
        this.size++;
    }

    //链表尾新增节点
    public void addLast(Object data) {
       Node node = new Node(data);
       if(isEmpty()) {
           this.head = node;
           this.real = node;
       } else {
           this.real.next = node;
       }
       this.size++;
    }

    //删除头部节点，成功返回true，失败返回false
    public Boolean removeHead() {
        if(isEmpty()) {
            return false;
        } else {
            this.head = this.head.next;
            if(this.head == null) {
                this.real = null;
            }
            this.size--;
        }

        return true;
    }

    //判断是否为空
    public Boolean isEmpty() {
        return this.size <= 0 ? true:false;
    }

    //获得链表的节点个数
    public int getNodeNums() {
        return this.size;
    }

    //显示节点信息
    public void display() {
        if(size >0){
            Node node = head;
            int tempSize = size;
            if(tempSize == 1){//当前链表只有一个节点
                System.out.println("["+node.data+"]");
                return;
            }
            while(tempSize>0){
                if(node.equals(head)){
                    System.out.print("["+node.data+"->");
                }else if(node.next == null){
                    System.out.print(node.data+"]");
                }else{
                    System.out.print(node.data+"->");
                }
                node = node.next;
                tempSize--;
            }
            System.out.println();
        }else{//如果链表一个节点都没有，直接打印[]
            System.out.println("[]");
        }
    }

    public class Node{
        private Object data;
        private Node next;

        public Node(Object data) {
            this.data = data;
        }
    }
}
